/**
 * 获取变量类型
 * @param value
 * @return 变量类型(string，全部小写字母)
 * @since V1.0.0
 */
export function getVarType(value: any): string {
    return Object.prototype.toString.call(value).slice(8, -1).toLowerCase();
}

/**
 * 检查value值是否为null
 * @param value
 * @since V1.0.0
 */
export function isNull(value: any): boolean {
    return value === null;
}

/**
 * 检查value值是否为undefined
 * @param value
 * @since V1.0.0
 */
export function isUndefined(value: any): boolean {
    return value === undefined;
}

/**
 * 检查value的类型是否为number或者Number对象
 * @param value
 * @since V1.0.0
 */
export function isNumber(value: any): boolean {
    const type = typeof value;
    return type === 'number' || (type === 'object' && getVarType(value) === 'number');
}

/**
 * 检查value的类型是否为string或者String对象
 * @param value
 * @since V1.0.0
 */
export function isString(value: any): boolean {
    const type = typeof value;
    return type === 'string' || (type === 'object' && getVarType(value) === 'string');
}

/**
 * 检查value的类型是否为boolean或者Boolean对象
 * @param value
 * @since V1.0.0
 */
export function isBoolean(value: any): boolean {
    return value === true || value === false || (typeof value === 'object' && getVarType(value) === 'boolean');
}

/**
 * 检查value是否为symbol类型
 * @param value
 * @since V1.0.0
 */
export function isSymbol(value: any): boolean {
    const type = typeof value;
    return type === 'symbol' || (type === 'object' && getVarType(value) == 'symbol');
}

/**
 * 检查value类型是否为Array对象
 * @param value
 * @since V1.0.0
 */
export function isArray(value: any): boolean {
    const type = typeof value;
    return value != null && type === 'object' && getVarType(value) === 'array';
}

/**
 * 检查value类型是否为Date对象
 * @param value
 * @since V1.0.0
 */
export function isDate(value: any): boolean {
    const type = typeof value;
    return value != null && type === 'object' && getVarType(value) === 'date';
}

/**
 * 检查value值是否为Map类型
 * @param value
 * @since V1.0.0
 */
export function isMap(value: any): boolean {
    const type = typeof value;
    return value !== null && type === 'object' && getVarType(value) === 'map';
}

/**
 * 检查value值是否为Set类型
 * @param value
 * @since V1.0.0
 */
export function isSet(value: any): boolean {
    const type = typeof value;
    return value !== null && type === 'object' && getVarType(value) === 'set';
}

/**
 * 检查value是否为Function
 * @param value
 * @since V1.0.0
 */
export function isFunction(value: any): boolean {
    return typeof value === 'function';
}

/**
 * 检查value值是否为RegExp类型
 * @param value
 * @since 1.0.0
 */
export function isRegExp(value: any): boolean {
    const type = typeof value;
    return value !== null && type === 'object' && getVarType(value) === 'regexp';
}

/**
 * 检查value的类型是否为Object对象(Object、Array、...)
 * @param value 参数
 * @returns true or false
 * @since V1.0.0
 */
export function isObject(value: any): boolean {
    const type = typeof value;
    return value != null && (type === 'object' || type === 'function');
}

/**
 * 检查value是否为object对象
 * @param value 参数值
 * @returns true or false
 * @since V1.0.0
 */
export function isObj(value: any): boolean {
    const type = typeof value;
    return value != null && type === 'object' && getVarType(value) === 'object';
}

/**
 * 判断value是否为空(null、undefined、空对象、空数组、...)
 * <p>仅支持检查类型为null、undefined、Array、String、Map、Set、Object的参数值，其它类型返回false</p>
 * @param value 参数
 * @returns {boolean} true or false
 * @since 1.1.0
 *
 * ```
 * isEmpty({})                      // true
 * isEmpty({id: '1'})               // false
 * isEmpty([])                      // true
 * isEmpty([1, 2, 3])               // false
 * isEmpty(new Set())               // true
 * isEmpty(new Set([]))             // true
 * isEmpty(new Set([10, 11, 12]))   // false
 * ```
 */
export function isEmpty(value: any): boolean {
    if (value == null) {
        return true;
    }
    if (Array.isArray(value) || isString(value)) {
        return !(value as any).length;
    }
    if (isMap(value) || isSet(value)) {
        return !(value as any).size;
    }
    if (isObj(value)) {
        return !Object.keys(value).length;
    }
    console.warn(`isEmpty() 方法仅支持检查value是否为null/undefined，以及Array、String、Map、Set和Object是否为空。`);
    return false;
}
